<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript">
        
        //创建函数 函数也是对象
            var fun = new Function("console.log(\"function run\");");
            //会在代码执行前执行
            function fun2(str){
                console.log(str);
            }

            var fun3 = function(str){
                console.log(str);
            };
        //执行
        fun();
        console.log(typeof fun);
        console.log(fun2);
        console.log(fun3);
        fun2("fun2");
        fun3("fun3");

        //入参
        function fun4(funn,str){
            funn(str)
        }

        fun4(function(str){console.log(str);},"fun in fun args");
        //返回值
        function fun5(){
            fun5.name = "fun5";
            return fun5.name;
        }

        var fun5Name = fun5();
        console.log(fun5Name);

        //函数调用一次
        (function(){
            console.log("调用一次")
        })();

        var obj = {
            name : "obj",
            age : 12
        };

        for (var v in obj){
            console.log(v);
            console.log(obj[v]);
        }

        //函数闭包
        function fun6(){
            var name = "fun6";
            function fun7(str){
                console.log("函数闭包");
                console.log(name + str + fun7.name);
            }
            return fun7;
        }
        var fun = fun6();
        fun("-111-")

        this.fun("zaaaz")

        /*
        * this根据调用者的不同this代表的不同
        * 函数的调用时this=window
        * 方法的调用时this=对象
        */

        //call apply区别：
        //call：第一个参数是this的指向，后面的参数是传递给函数的参数
        //apply：第一个参数是this的指向，后面的参数是传递给函数的参数，参数是数组
        //call和apply的区别：传递参数的个数不同，call传递参数是逗号隔开，apply传递参数是数组
        console.log("---------call apply---------");
        function fun8(str){
            console.log(str);
            console.log(this);
        }
        fun8.call(this,"call");
        fun8.call(obj,"call");
        fun8.apply(this,["apply"]);

        //arguments: 函数隐含默认参数
        console.log("---------arguments---------");
        function fun9(){
            console.log("arguments="+arguments);
            console.log("arguments.length="+arguments.length);
            console.log(arguments[0]);
            console.log(arguments[1]);
            console.log(arguments[2]);
            console.log(arguments.callee); //当前函数
        }
        fun9("1","2","3");


    </script>
</head>
<body>
    
</body>
</html>